package main

import (
	"fmt"
)

// 开关输入状态数据结构
type SwitchStatus struct {
	ReturnCode    byte
	SwitchValues  [22]byte // 22个开关状态字段，每个字段 1 字节
}

// 编码开关状态数据
func encodeSwitchStatus(data SwitchStatus) []byte {
	return data.SwitchValues[:]
}

// 校验和计算函数（CHKSUM）
func calculateChecksum(data []byte) []byte {
	var sum int32
	for _, b := range data {
		sum += int32(b)
	}
	checksum := sum % 65536
	checksum = ^checksum + 1
	return []byte{byte(checksum >> 8), byte(checksum & 0xFF)}
}

// 构建获取开关输入状态命令帧
func buildGetSwitchStatusCommand() []byte {
	soi := []byte{0x7E}    // SOI
	ver := []byte{0x21}    // VER
	adr := []byte{0x01}    // ADR
	cid1 := []byte{0x60}   // CID1: 设备类型 - 分散空调
	cid2 := []byte{0x43}   // CID2: 获取开关输入状态命令
	length := []byte{0x00, 0x00} // LENGTH（LENID 为 0）
	checksum := calculateChecksum(append(soi, append(ver, append(adr, append(cid1, append(cid2, length...)...)...)...)...)
	eoi := []byte{0x0D}    // EOI

	// 拼接完整的命令帧
	commandFrame := append(soi, append(ver, append(adr, append(cid1, append(cid2, append(length, append(checksum, eoi...)...)...)...)...)
	return commandFrame
}

// 构建响应帧
func buildSwitchStatusResponse(data SwitchStatus) []byte {
	soi := []byte{0x7E}    // SOI
	ver := []byte{0x21}    // VER
	adr := []byte{0x01}    // ADR
	cid1 := []byte{0x60}   // CID1: 设备类型 - 分散空调
	rtc := []byte{data.ReturnCode} // RTN: 返回码
	encodedData := encodeSwitchStatus(data) // DATA INFO
	length := []byte{0x00, 0x44} // LENGTH (LENID=44)
	checksum := calculateChecksum(append(soi, append(ver, append(adr, append(cid1, append(rtc, append(length, append(encodedData, eoi...)...)...)...)...)
	eoi := []byte{0x0D}    // EOI

	// 拼接完整的响应帧
	responseFrame := append(soi, append(ver, append(adr, append(cid1, append(rtc, append(length, append(encodedData, append(checksum, eoi...)...)...)...)...)
	return responseFrame
}

func main() {
	// 示例：构建获取开关输入状态命令
	commandFrame := buildGetSwitchStatusCommand()
	fmt.Printf("获取开关输入状态命令帧: %X\n", commandFrame)

	// 示例：构建响应帧，包含开关状态数据
	switchData := SwitchStatus{
		ReturnCode: 0x00, // 正常返回
		SwitchValues: [22]byte{
			0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
			0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01,
			0x01, 0x00, 0x01,
		},
	}
	responseFrame := buildSwitchStatusResponse(switchData)
	fmt.Printf("开关输入状态响应帧: %X\n", responseFrame)
}
